package manager.modulo.estoque.dao;

import java.sql.SQLException;
import manager.auxiliares.MensagemExcessao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.LinkedList;
import manager.auxiliares.Configurations;
import manager.auxiliares.Format;
import manager.principal.fonte.JanelaLogin;
import manager.interfaces.InterfaceDao;
import manager.modulo.estoque.enumerator.EnumTipoEntradaEstoque;
import manager.modulo.estoque.enumerator.EnumTipoEntradaEstoque.TipoEntradaEstoque;

/**
 * Esta classe será utilizada para cadastra a entidade user no banco de dados
 *
 * @author Thiago
 */
public class EntradaEstoqueDAO implements InterfaceDao {

    private int id;
    private String documento;
    private int idUsuario;
    private TipoEntradaEstoque tipoEntrada;
    private String observacao;
    private int idClienteFornecedor;
    private Timestamp dtEntrada;
    private int idCentroCusto;

    /**
     * Inicializando as variáveis
     */
    public EntradaEstoqueDAO() {
        documento = "";
        idUsuario = 0;
        tipoEntrada = TipoEntradaEstoque.NAOENCONTRADO;
        idClienteFornecedor = 0;
        observacao = "";
        dtEntrada = new Timestamp(00 - 00 - 00);
        idCentroCusto = 0;
    }

    public LinkedList<String> buscar(String opcao, String palavraBuscada, boolean limite) throws SQLException {
        LinkedList<String> result = new LinkedList<String>();
        if (!palavraBuscada.equals("")) {
            String sql = "";
            String tamanhoBusca = limite ? ("LIMIT 0," + Configurations.getAutoCompleteSizeSearch()) : "";
            if (opcao.equalsIgnoreCase("Documento")) {// Buscando por Nome
                sql = "SELECT tx_documento FROM entrada_estoque WHERE tx_documento LIKE ? ORDER BY tx_documento " + tamanhoBusca;
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Número da Entrada")) {// Buscando por Nome
                sql = "SELECT id FROM entrada_estoque WHERE id LIKE ? ORDER BY id " + tamanhoBusca;
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Centro de Custo")) {
                sql = "SELECT tx_nome FROM centro_custo WHERE tx_nome LIKE ? ORDER BY tx_nome " + tamanhoBusca;
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Cliente/Fornecedor")) {
                sql = "SELECT tx_identificador FROM cliente_fornecedor WHERE tx_identificador LIKE ? ORDER BY tx_identificador " + tamanhoBusca;
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Nome do Insumo")) {
                sql = "SELECT tx_nome FROM insumo WHERE tx_nome LIKE ? ORDER BY tx_nome " + tamanhoBusca;
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Identificador do Insumo")) {
                sql = "SELECT tx_identificador FROM insumo WHERE tx_identificador LIKE ? ORDER BY tx_identificador " + tamanhoBusca;
                palavraBuscada += "%";
            } 
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, palavraBuscada);
                ResultSet resultSet = preparedStatement.executeQuery();
                while (resultSet.next()) {
                    result.add(resultSet.getString(1));
                }
            }
        }
        return result;
    }

    public static LinkedList buscarTabela(String opcao, String palavraBuscada) throws SQLException {
        LinkedList result = new LinkedList();
        if (!palavraBuscada.equals("")) {
            String sql = "";
            if (opcao.equalsIgnoreCase("Documento")) { // Buscando por nome
                sql = "SELECT "
                        + " e.id as IdEntrada, "
                        + " cf.tx_identificador as ClienteFornecedor, "
                        + " e.tx_documento as Documento, "
                        + " u.tx_nome as Funcionario , "
                        + " e.cd_tipo as TipoEntrada, "
                        + " c.tx_nome as CentroCusto, "
                        + " e.dt_entrada as DtEntrada "
                        + "FROM "
                        + " entrada_estoque e "
                        + " INNER JOIN usuario u ON u.id = e.id_usuario "
                        + " INNER JOIN centro_custo c ON c.id = e.id_centro_custo "
                        + " INNER JOIN cliente_fornecedor cf ON cf.id = e.id_cliente_fornecedor "
                        + "WHERE "
                        + " e.tx_documento LIKE ? "
                        + "ORDER BY e.id DESC";
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Número da Entrada")) { // Buscando por nome
                sql = "SELECT "
                        + " e.id as IdEntrada, "
                        + " cf.tx_identificador as ClienteFornecedor, "
                        + " e.tx_documento as Documento, "
                        + " u.tx_nome as Funcionario , "
                        + " e.cd_tipo as TipoEntrada, "
                        + " c.tx_nome as CentroCusto, "
                        + " e.dt_entrada as DtEntrada "
                        + "FROM "
                        + " entrada_estoque e "
                        + " INNER JOIN usuario u ON u.id = e.id_usuario "
                        + " INNER JOIN centro_custo c ON c.id = e.id_centro_custo "
                        + " INNER JOIN cliente_fornecedor cf ON cf.id = e.id_cliente_fornecedor "
                        + "WHERE "
                        + " e.id LIKE ? "
                        + "ORDER BY e.id DESC";
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Centro de Custo")) { // Buscando por nome
                sql = "SELECT "
                        + " e.id as IdEntrada, "
                        + " cf.tx_identificador as ClienteFornecedor, "
                        + " e.tx_documento as Documento, "
                        + " u.tx_nome as Funcionario , "
                        + " e.cd_tipo as TipoEntrada, "
                        + " c.tx_nome as CentroCusto, "
                        + " e.dt_entrada as DtEntrada "
                        + "FROM "
                        + " entrada_estoque e "
                        + " INNER JOIN usuario u ON u.id = e.id_usuario "
                        + " INNER JOIN centro_custo c ON c.id = e.id_centro_custo "
                        + " INNER JOIN cliente_fornecedor cf ON cf.id = e.id_cliente_fornecedor "
                        + "WHERE "
                        + " c.tx_nome LIKE ? "
                        + "ORDER BY e.id DESC";
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Nome do Insumo")) { // Buscando por nome
                sql = "SELECT "
                        + " e.id as IdEntrada, "
                        + " cf.tx_identificador as ClienteFornecedor, "
                        + " e.tx_documento as Documento, "
                        + " u.tx_nome as Funcionario , "
                        + " e.cd_tipo as TipoEntrada, "
                        + " c.tx_nome as CentroCusto, "
                        + " e.dt_entrada as DtEntrada "
                        + "FROM "
                        + " entrada_estoque e "
                        + " INNER JOIN usuario u ON u.id = e.id_usuario "
                        + " INNER JOIN centro_custo c ON c.id = e.id_centro_custo "
                        + " INNER JOIN cliente_fornecedor cf ON cf.id = e.id_cliente_fornecedor "
                        + " INNER JOIN insumo_entrada ie ON ie.id_entrada = e.id "
                        + " LEFT JOIN insumo i ON i.id = ie.id_insumo "
                        + "WHERE "
                        + " i.tx_nome LIKE ? "
                        + "ORDER BY e.id DESC";
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Identificador do Insumo")) { // Buscando por Identificador
                sql = "SELECT "
                        + " e.id as IdEntrada, "
                        + " cf.tx_identificador as ClienteFornecedor, "
                        + " e.tx_documento as Documento, "
                        + " u.tx_nome as Funcionario , "
                        + " e.cd_tipo as TipoEntrada, "
                        + " c.tx_nome as CentroCusto, "
                        + " e.dt_entrada as DtEntrada "
                        + "FROM "
                        + " entrada_estoque e "
                        + " INNER JOIN usuario u ON u.id = e.id_usuario "
                        + " INNER JOIN centro_custo c ON c.id = e.id_centro_custo "
                        + " INNER JOIN cliente_fornecedor cf ON cf.id = e.id_cliente_fornecedor "
                        + " INNER JOIN insumo_entrada ie ON ie.id_entrada = e.id "
                        + " LEFT JOIN insumo i ON i.id = ie.id_insumo "
                        + "WHERE "
                        + " i.tx_identificador LIKE ? "
                        + "ORDER BY e.id DESC";
                palavraBuscada += "%";
            }

            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, palavraBuscada);
                ResultSet resultSet = preparedStatement.executeQuery();

                LinkedList<String> colunaClienteFornecedor = new LinkedList<String>();
                LinkedList<String> colunaDocumento = new LinkedList<String>();
                LinkedList<String> colunaTipoEntrada = new LinkedList<String>();
                LinkedList<String> colunaDtEntrada = new LinkedList<String>();
                LinkedList<String> colunaCentroCusto = new LinkedList<String>();
                LinkedList<String> colunaNumeroEntrada = new LinkedList<String>();
                LinkedList<Integer> colunaId = new LinkedList<Integer>();

                while (resultSet.next()) {
                    colunaId.add(resultSet.getInt("IdEntrada"));
                    colunaNumeroEntrada.add(resultSet.getString("IdEntrada"));
                    colunaClienteFornecedor.add(resultSet.getString("ClienteFornecedor"));
                    colunaDocumento.add(resultSet.getString("Documento"));
                    colunaTipoEntrada.add(EnumTipoEntradaEstoque.ConvertEnumString(EnumTipoEntradaEstoque.ConverterNumeroEnum(resultSet.getInt("TipoEntrada"))));
                    colunaCentroCusto.add(resultSet.getString("CentroCusto"));
                    colunaDtEntrada.add(Format.formatTimeStampToCompleteDatetime(resultSet.getTimestamp("DtEntrada")));
                }

                result.add(colunaId);
                result.add(Format.getBooleanLinkedList(colunaId.size()));
                result.add(colunaNumeroEntrada);
                result.add(colunaClienteFornecedor);
                result.add(colunaCentroCusto);
                result.add(colunaDocumento);
                result.add(colunaTipoEntrada);
                result.add(colunaDtEntrada);
                result.add(Format.getBooleanLinkedList(colunaId.size()));
            }
        }
        return result;
    }

    /**
     * Carregar as informações do objeto usuário a partir de um id
     *
     * @param id Id do usuário buscado
     */
    public void buscar(int id) {
        try {
            setId(id);
            String sql = "SELECT * FROM entrada_estoque WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.first()) {
                documento = resultSet.getString("tx_documento");
                tipoEntrada = EnumTipoEntradaEstoque.ConverterNumeroEnum(resultSet.getInt("cd_tipo"));
                idClienteFornecedor = resultSet.getInt("id_cliente_fornecedor");
                observacao = resultSet.getString("tx_observacao");
                dtEntrada = resultSet.getTimestamp("dt_entrada");
                idUsuario = resultSet.getInt("id_usuario");
                idCentroCusto = resultSet.getInt("id_centro_custo");
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Materiais");
        }
    }

    /**
     * Insere um usuário no banco
     */
    public void inserir() throws SQLException {

        String sql = "INSERT INTO entrada_estoque "
                + "(tx_documento,"
                + " cd_tipo,"
                + " id_cliente_fornecedor,"
                + " tx_observacao,"
                + " dt_entrada,"
                + " id_usuario,"
                + " id_centro_custo) "
                + "VALUES ("
                + "?," // 01 Documento
                + "?," // 02 Tipo
                + "?," // 03 Cliente Fornecedor
                + "?," // 04 Observacao
                + "?," // 06 Data de Entrada
                + "?," // 07 Funcionário Conferência
                + "?)"; // 08 Centro de Custo
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setString(1, documento);
        preparedStatement.setInt(2, EnumTipoEntradaEstoque.ConverterEnumNumero(tipoEntrada));
        preparedStatement.setInt(3, idClienteFornecedor);
        preparedStatement.setString(4, observacao);
        preparedStatement.setTimestamp(5, dtEntrada);
        preparedStatement.setInt(6, idUsuario);
        preparedStatement.setInt(7, idCentroCusto);

        preparedStatement.executeUpdate();

        //Recebendo o novo id gerado
        ResultSet resultSet = preparedStatement.getGeneratedKeys();
        while (resultSet.next()) {
            id = resultSet.getInt(1);
        }

        preparedStatement.close();
        resultSet.close();
    }

    /**
     * Atualiza o usuário no banco
     */
    public void atualizar() throws SQLException {
        String sql = "  UPDATE entrada_estoque SET "
                + "     cd_tipo = ? ," // 01
                + "     tx_documento = ? ," // 02
                + "     id_cliente_fornecedor = ? ," // 03
                + "     tx_observacao = ? ," // 04
                + "     dt_entrada = ? ," // 06
                + "     id_usuario = ? ," // 07
                + "     id_centro_custo = ?" // 10
                + " WHERE "
                + "     id = ?";             // 11
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setInt(1, EnumTipoEntradaEstoque.ConverterEnumNumero(tipoEntrada));
        preparedStatement.setString(2, documento);
        preparedStatement.setInt(3, idClienteFornecedor);
        preparedStatement.setString(4, observacao);
        preparedStatement.setInt(5, idUsuario);
        preparedStatement.setInt(6, idCentroCusto);
        preparedStatement.setInt(7, id);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }

    public void deletar() throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDocumento() {
        return documento;
    }

    public void setDocumento(String documento) {
        this.documento = documento;
    }

    public int getIdUsuario() {
        return idUsuario;
    }

    public void setIdUsuario(int idUsuario) {
        this.idUsuario = idUsuario;
    }

    public TipoEntradaEstoque getTipoEntrada() {
        return tipoEntrada;
    }

    public void setTipoEntrada(TipoEntradaEstoque tipoEntrada) {
        this.tipoEntrada = tipoEntrada;
    }

    public String getObservacao() {
        return observacao;
    }

    public void setObservacao(String observacao) {
        this.observacao = observacao;
    }

    public int getIdClienteFornecedor() {
        return idClienteFornecedor;
    }

    public void setIdClienteFornecedor(int idClienteFornecedor) {
        this.idClienteFornecedor = idClienteFornecedor;
    }

    public Timestamp getDtEntrada() {
        return dtEntrada;
    }

    public void setDtEntrada(Timestamp dtEntrada) {
        this.dtEntrada = dtEntrada;
    }

    public int getIdCentroCusto() {
        return idCentroCusto;
    }

    public void setIdCentroCusto(int idCentroCusto) {
        this.idCentroCusto = idCentroCusto;
    }
}
